﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing.Design;
using System.ComponentModel;
using Microsoft.DirectX.Direct3D;
using Microsoft.DirectX;

namespace DirectX_CS
{
	public class Range3d//: ICustomTypeDescriptor
	{					
		
//        public class Range3dTypeConverter : TypeConverter//System.ComponentModel.TypeConverter 
//        {
//                 //optionally override virtual members for more complex systems.

//        }
//#region "How to create a Property Descriptor for an object if say that property you wanted is showing up grayed"

//        public class Range3dPropertyDescriptor : PropertyDescriptor
//        {
//            public Range3dPropertyDescriptor()
//            {

//            }
//            public override bool CanResetValue(object component)
//            {
//                return true;
//            }

//            public override Type ComponentType
//            {
//                get { return typeof(Range3d); }
//            }

//            public override object GetValue(object component)
//            {
//                return base.getv;
//            }

//            public override bool IsReadOnly
//            {
//                get { return false; }
//            }

//            public override Type PropertyType
//            {
//                get { throw new NotImplementedException(); }
//            }

//            public override void ResetValue(object component)
//            {
//                throw new NotImplementedException();
//            }

//            public override void SetValue(object component, object value)
//            {
//                throw new NotImplementedException();
//            }

//            public override bool ShouldSerializeValue(object component)
//            {
//                throw new NotImplementedException();
//            }
//        }
//        #endregion

//        public static PropertyDescriptor[] descriptors = new Range3dPropertyDescriptor[6];

//        public class Range3dPropertyDescriptorCollection : PropertyDescriptorCollection
//        {
//        //{
//        //    Range3dPropertyDescriptor descriptors = new DoubleConverter();
//        //    //xMin.PropertyType = typeof(float);
//        //    Range3dPropertyDescriptor xMax = new DoubleConverter();
//        //    //xMax.PropertyType = typeof(float);
//        //    Range3dPropertyDescriptor yMin = new DoubleConverter();
//        //    //yMin.PropertyType = typeof(float);
//        //    Range3dPropertyDescriptor yMax = new DoubleConverter();
//        //    //yMax.PropertyType = typeof(float);
//        //    Range3dPropertyDescriptor zMin = new DoubleConverter();
//        //    //zMin.PropertyType = typeof(float);
//        //    Range3dPropertyDescriptor zMax = new DoubleConverter();

//            public Range3dPropertyDescriptorCollection()
//                : base((PropertyDescriptor[]) descriptors)
//            {

//            }
//            //public Range3dPropertyDescriptorCollection(object selected)
//            //{

//            //    //zMax.PropertyType = typeof(float);
			
//            //    //should save instance of object here for future reference
//            //    base.Add(
//            //}
			
//        }	 



//        #region ICUstomTypeDescriptor

//        public System.ComponentModel.AttributeCollection GetAttributes()
//        {
//            return TypeDescriptor.GetAttributes(this, true);
//        }
		
//        public string GetClassName()
//        {
//            return TypeDescriptor.GetClassName(this, true);
//        }
		
//        public string GetComponentName()
//        {
//            return TypeDescriptor.GetComponentName(this, true);
//        }
		
//        public System.ComponentModel.TypeConverter GetConverter()
//        {
//            return new Range3dTypeConverter(); //TypeDescriptor.GetConverter(this, true);
//        }
		
//        public System.ComponentModel.EventDescriptor GetDefaultEvent()
//        {
//            return TypeDescriptor.GetDefaultEvent(this, true);
//        }
		
//        public System.ComponentModel.PropertyDescriptor GetDefaultProperty()
//        {
//            return TypeDescriptor.GetDefaultProperty(this, true);
//        }
		
//        public object GetEditor(System.Type editorBaseType)
//        {
//            return TypeDescriptor.GetEditor(this, editorBaseType, true);
//        }
		
//        public System.ComponentModel.EventDescriptorCollection GetEvents()
//        {
//            return TypeDescriptor.GetEvents(this, true);
//        }
		
//        public System.ComponentModel.EventDescriptorCollection GetEvents(System.Attribute[] attributes)
//        {
//            return TypeDescriptor.GetEvents(this, attributes, true);
//        }
		

//        public System.ComponentModel.PropertyDescriptorCollection GetProperties()
//        {

//            PropertyDescriptorCollection props = new PropertyDescriptorCollection(descriptors); //TypeDescriptor.GetProperties(this, true);
//            //props.Remove(
//            //PropertyDescriptor descriptor = new PropertyDescriptor();
//            return props;
//        }
		
//        public System.ComponentModel.PropertyDescriptorCollection GetProperties(System.Attribute[] attributes)
//        {
//            //return TypeDescriptor.GetProperties(this, attributes, true);
//            PropertyDescriptorCollection props = new PropertyDescriptorCollection(descriptors);
//            return props;
//        }

//        #endregion

		
//        public object GetPropertyOwner(System.ComponentModel.PropertyDescriptor pd)
//        {
//            return this;
//        }			
	
			public Range3d()
			{
			
			}			

			public Range3d(Vector3 minRange, Vector3 maxRange)
			{
				xMin = 0;	 //required to make a struct, The 'this' object cannot be used before all of its fields are assigned to.
				yMin = 0;
				zMin = 0;
				xMax = 0;
				yMax = 0;
				zMax = 0;
				Min = minRange; Max = maxRange;
			}
			public Range3d(float xMinimum, float yMinimum, float zMinimum, float xMaximum, float yMaximum, float zMaximum)
			{
				xMin = xMinimum;
				yMin = yMinimum;
				zMin = zMinimum;
				xMax = xMaximum;
				yMax = yMaximum;
				zMax = zMaximum;
			}
			[PGBrowsable]
			public Vector3 Min
			{
				get
				{
					return new Vector3(xMin, yMin, zMin);
				}
				set
				{
					xMin = value.X; yMin = value.Y; zMin = value.Z;
				}
			}
			[PGBrowsable]
			public Vector3 Max
			{
				get
				{
					return new Vector3(xMax, yMax, zMax);
				}
				set
				{
					xMax = value.X; yMax = value.Y; zMax = value.Z;
				}
			}
			public float xMin;
			public float xMax;
			public float yMin;
			public float yMax;
			public float zMin;
			public float zMax;
			//public float XMin
			//{
			//    get { return xMin; }
			//    set { xMin = value; }
			//}
			//public float XMax
			//{
			//    get { return xMax; }
			//    set { xMax = value; }
			//}

			//public float YMin
			//{
			//    get { return yMin; }
			//    set { yMin = value; }
			//}		
			//public float ZMin
			//{
			//    get { return zMin; }
			//    set { zMin = value; }
			//}	

			//public float YMax
			//{
			//    get { return yMax; }
			//    set { yMax = value; }
			//}	
			//public float ZMax
			//{
			//    get { return zMax; }
			//    set { zMax = value; }
			//}	






			//#region ICustomTypeDescriptor Members

			//AttributeCollection ICustomTypeDescriptor.GetAttributes()
			//{
			//    throw new NotImplementedException();
			//}

			//string ICustomTypeDescriptor.GetClassName()
			//{
			//    throw new NotImplementedException();
			//}

			//string ICustomTypeDescriptor.GetComponentName()
			//{
			//    throw new NotImplementedException();
			//}

			//TypeConverter ICustomTypeDescriptor.GetConverter()
			//{
			//    throw new NotImplementedException();
			//}

			//EventDescriptor ICustomTypeDescriptor.GetDefaultEvent()
			//{
			//    throw new NotImplementedException();
			//}

			//PropertyDescriptor ICustomTypeDescriptor.GetDefaultProperty()
			//{
			//    throw new NotImplementedException();
			//}

			//object ICustomTypeDescriptor.GetEditor(Type editorBaseType)
			//{
			//    throw new NotImplementedException();
			//}

			//EventDescriptorCollection ICustomTypeDescriptor.GetEvents(Attribute[] attributes)
			//{
			//    throw new NotImplementedException();
			//}

			//EventDescriptorCollection ICustomTypeDescriptor.GetEvents()
			//{
			//    throw new NotImplementedException();
			//}

			//PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[] attributes)
			//{
			//    throw new NotImplementedException();
			//}

			//PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties()
			//{
			//    throw new NotImplementedException();
			//}

			//object ICustomTypeDescriptor.GetPropertyOwner(PropertyDescriptor pd)
			//{
			//    throw new NotImplementedException();
			//}

			//#endregion
	}
}
